{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Vigenère et Kasiski\n", "
\n", "

Navigation dans la page

\n", "

\n", " Si c'est votre première visite dans ce TP, lisez attentivement chacun des points détaillé après ce paragraphe.
\n", " Si vous avez déjà commencer à travailler sur ce TP et que vous souhaiter vous déplacer rapidement dans une partie précise vous pouvez choisir la partie que vous souhaitez rejoindre ci-dessous.
\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

\n", "\n", "
\n", " Technologie jupyter\n", "

\n", " La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
\n", " Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
\n", " Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
\n", " La plateforme propose quelques outils de purge de la mémoire : \n", "

\n", "

\n", "
\n", "

SAUVEGARDER VOTRE TRAVAIL

\n", "

\n", " Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S\n", " est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.

\n", "

A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.\n", "

    \n", "
  1. Lancer un terminal
  2. \n", "
  3. Taper la commande suivante : pip install jupyterlab
  4. \n", "
  5. Une fois l'installation terminée portez votre attention sur les dernières lignes affichées dans votre terminal vous invitant probablement à taper une ligne de commande pour faire une mise à jour
  6. \n", "
  7. Pour lancer notebook de jupyter, taper dans votre termial : jupyter notebook
  8. \n", "
  9. Votre simulateur de serveur est lancé. Il ne faut pas fermer votre terminal, auquel cas votre simulateur de serveur s'interompera. Suivez le lien indiqué dans les dernières lignes de votre terminal pour vous diriger vers votre espace local. L'interface se présente comme celle que vous trouverez sur le web. Votre travail sera cependant toujours enregistré et jamais perdu même si vous le consultez après plusieurs jours
  10. \n", "
\n", "

\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Comme pour le TP1, TP2 et TP3, une bibliothèque regroupant quelques outils de la cryptologie vous ont été donnée. Chargeons l'intégralité des fonctionnalités qu'elle propose

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from OutilsCrypto import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Vous êtes invité à travailler sur la première partie du TP1 pour vous refamiliariser avec les fonctionnalités de cette bibliothèque comme codex, codex, xedoc, paquet, mode2base, Filtre ainsi que les fonctions d'attaque par dictionnaire.

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Partie 1 : Cryptosystème de Vigenère \n", "
\n", "\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Chiffrement

\n", "

Ecrire la fonction C_VIGENERE(txt, clef) qui prend en paramètre une message txt et une clef tous les deux des chaines de caractères et qui renvoie la chaine de caractère correspondant au chiffrement de Vigenère.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def C_VIGENERE(txt, clef) :\n", " return \"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Test

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt=\"VOICIUNMESSAGEDEVIGENRE\"\n", "clef=\"CLEF\"\n", "print(C_VIGENERE(txt, clef))\n", "#XZMHKFRRGDWFIPHJXTKJPCI" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Déchiffrement

\n", "

Ecrire la fonction D_VIGENERE(txt, clef) qui prend en paramètre une message txt et une clef tous les deux des chaines de caractères et qui renvoie la chaine de caractère correspondant au déchiffrement de Vigenère.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def D_VIGENERE(txt, clef) :\n", " return \"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Test

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt=\"XZMHKFRRGDWFIPHJXTKJPCI\"\n", "clef=\"CLEF\"\n", "print(D_VIGENERE(txt, clef))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Partie 2 : Préparation à l'attaque de Kasiki \n", "
\n", "\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Le principe de l'attaque de Kasiski est de déterminer la longueur de la clef en observant la longueur qui sépare certain cryptograme qui se répète. Cette longueur est le $PGCD$ de ces longueur.

\n", "

PGCD

\n", "

Reprennez la fonction $PGCD$ du TP2

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def PGCD(a, b) :\n", " return 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Tests

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X=[1234, 1234, 9876, 2020]\n", "res=0\n", "for n in X : res=PGCD(res, n)\n", "print(\"PGCD(\",X[0],\",\",X[1],\",\",X[2],\",\",X[3],\")=\", res)\n", "#Le résultat est 2." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Principe

\n", "

Dans un premier temps, il faut déterminer les cryptogrammes qui se répètent et dans la second temps, le nombre de caractère qui les sépare.

\n", "

La fonction suivante, crée un arbre composée de tous les mots qui compose le message (txt) qui ont une longueur entre a (valeur par défaut 4) b (valeur par défaut 7).

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def VIGENERE_DICO(txt, a=4, b=7) :\n", " try : \n", " txt=str(txt)\n", " a=int(a)\n", " b=int(b)\n", " except : return dict()\n", "\n", " Racine=dict()\n", "\n", " def constructBranche(mot):\n", " Arbre = Racine\n", " for c in mot :\n", " if not (c in Arbre): \n", " Arbre[c] = dict()\n", " Arbre[c]['FINMOT']=False\n", " #On avance dans l'arbre\n", " Arbre = Arbre[c]\n", " #Arrivé à la fin on marque que le mot est fini\n", " Arbre[\"FINMOT\"] = True\n", "\n", " n=len(txt)\n", " for i in range(n) :\n", " longueur=a\n", " while(longueur<=b) :\n", " #mot de longueur j\n", " mot=\"\"\n", " j=0\n", " while(j=n) : break\n", " #Ajout du mot au dictionnaire\n", " constructBranche(Filtre(mot).upper())\n", " longueur+=1\n", " return Racine" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Test et détail

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(VIGENERE_DICO(\"BONBON\", 2, 4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Avec l'exemple du mot \"BONBON\" l'abre dictionnaire des mots de longueur 2, 3 ou 4 donne :

\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Le bout de code suivant, utilise l'abre des mot du cyptogramme pour construire le tableau associatif lst_mots :\n", "

\n", " Si txt=\"BONBON\", a=2 et b=4 alors cette fonction renverra le dictionnaire :
\n", "{\n", " 'BO' : [0, 3],\n", " 'ON' : [1, 4],\n", " 'NB' : [2],\n", " 'BON' : [0, 3],\n", " 'ONB' : [1],\n", " 'NBO' : [2],\n", " 'BONB' : [0],\n", " 'ONBO' : [1],\n", " 'NBON' : [1]\n", "}\n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def VIGENERE_REPETITION(txt, a=3, b=7):\n", " if(bTests" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X=VIGENERE_REPETITION(\"BONBON\", 2, 4)\n", "for clef in X : \n", " print(\"'\"+str(clef)+\"':\\t\", X[clef])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Taille de la clef

\n", "

Utilisez la fonction précédente pour écrire la fonction Taille_Clef qui renvoie la taille hypotétique de la clef.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def Taille_clef(txt, a=3, b=7) :\n", " return 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Tests

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt=\"BONJOURAVOUSLESETUDIANTSJESPEREQUECECOURDECRYPTOVOUSPLAITETQUEVOUSYTROUVERDELINTERETETUNPEUDEPLAISIRENTOUTCASPOURMAPARTCENESTQUNEPARTIEDEPLAISIRLEPLAISIRESTDAILLEURBIENPLUSGRANDPOURMOIPARCEQUEJESAISENPLUSCEQUIVAARRIVERDANSLASUITERIREDEMONIAQUEHAHA\"\n", "clef=\"CRYPTO\"\n", "TXT=C_VIGENERE(txt,clef)\n", "print(\"MESSAGE A ATTAQUER :\", TXT)\n", "print(\"Cryptogramme qui se répètent :\")\n", "a=3\n", "b=10\n", "X=VIGENERE_REPETITION(TXT, a, b)\n", "for clef in X : \n", " if(len(X[clef])>1) : print(\"'\"+str(clef)+\"':\\t\", X[clef])\n", "\n", "print(\"TAILLE PROBABLE DE LA CLEF : \", Taille_clef(TXT,a, b))\n", "#Affiche 6" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "txt=\"BONJOURAVOUSLESETUDIANTSJESPEREQUECECOURDECRYPTOVOUSPLAITETQUEVOUSYTROUVERDELINTERETETUNPEUDEPLAISIRENTOUTCASPOURMAPARTCENESTQUNEPARTIEDEPLAISIRLEPLAISIRESTDAILLEURBIENPLUSGRANDPOURMOIPARCEQUEJESAISENPLUSCEQUIVAARRIVERDANSLASUITERIREDEMONIAQUEHAHA\"\n", "clef=\"UNECLEFUNPEUPLUSLONGUE\"\n", "TXT=C_VIGENERE(txt,clef)\n", "print(\"MESSAGE A ATTAQUER :\", TXT)\n", "print(\"Cryptogramme qui se répètent :\")\n", "a=3\n", "b=10\n", "X=VIGENERE_REPETITION(TXT, a, b)\n", "for clef in X : \n", " if(len(X[clef])>1) : print(\"'\"+str(clef)+\"':\\t\", X[clef])\n", "\n", "print(\"TAILLE PROBABLE DE LA CLEF : \", Taille_clef(TXT,a, b))\n", "#Affiche 22" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Partie 3 : Attaque de Kasiki \n", "
\n", "\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Une fois la taille de la clef estimée, il suffit de faire une attaque fréquentielle en espaçant le calcul des fréquence suivant la taille estimée. Rédiger la fonction suivante permettant de déterminer la clef.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def AttaqueKasiski(txt, taille_min_clef=1) :\n", " return \"\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Test

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "TXT=\"VNYISTSALVMEGLRFIBCYHUVUIAEVUEOTKXIUEUVHJTULWQAQSPFENIEEIOLITULPETNBGVFCCHYIEBTYSIYXBGOTLQFDOQIOOKKVJNYRYMLQVIQEHGEYTYLIKEXRRYAQJHFLUWIEEXIITQOHEDSWLTJSIXHLIVZPTEZLXFNBRTPTYPIYTKFQNEXHUFETHYVNZUEAPIEXEOOFIXEVKJSAJSEYTICEQOLWIOEURGIAGEVPCMJXRUYOUFEDZWJTYXVXUZDYSACMIBUQWVBPJHEWAXFVUEXHQLCPRQCRYFIYEAKUVEWHPLEBIMFNXHTWUARLEIMWMYCBVQFNNMIXEAFYWIYQWBUMTIUACWHLNACIHLUFMLLLVGFMVUIPTKYERUYWMDOVSVPDULXLSWEXPULOIALIEGIELGYCENCIUDYVSYAOFRJEUUHPMUVRUJYGIDIZRMTLYPEEIVVRWACQQPTIZWKEYIJZRKVHFTCUICDMDITLCYVPSCEWVRMLWLMIKVJSNHWDEURXSIMWIDSMGSVRGDPPNWIIQELGYPPWLVMAJUINIMLWFENUEJOVEEOTYIMWLMHYFLYVEYGMJRPMGHRELMESSEYWUFIKZSONYQSXMMIEKAGDMDPTLWFTFHWZYMLBURCVXPEBMEHUYEVFIAJINEHWHPSZZHFAOATZUZGVFSGHTPNMKVBINPICEUGPJSMDMEDMKISRYXVDFIEXBSNLUFEAZRDOHQYPSXFYSMILNFSYLEDEDRYCSQSMFNKXIYFQETPULDTLIAVVMEVDXEEUVRUDYPSYCWVYSJYPIORMJWBILHTPTIEXDEMWUFETHYFVCVMEECIUVIMRPWIKZXFLYQXCEMRPBPIUXPDMDEDHUPFCEYLIMQOHZTSQKIVRUWXLRLVWPLFLGTTIEXMEHWVPEICEQOLWIOEURGIAGEVPCMJXDEFDQPMMVXSIYQHPPTLWNOHDQPEVTINOGHRESMJIOTCWTWUAWSSTYQLPSQKEOTXRRNPIJTMUMOSYGBVQQSGRRDIMLVEIMMIZUURHBMYHRGEZZXFJCPTWOZVZPTLHTLRLFRNACVPPFIZXFSNTYPJMJSNMYLPWAQJIUVIXWPTMJZFNOIVLPXVVTIXRYNEUVRUSCIETBTVQFNNYSFSMKITVYQYEAXVVBLUSSCTMUINAWKEXBZVUVAJHMYEMKEJSDHGPRBRMODYYSFSIMSJRYQXPNLLIUAFRVDJWLZSIMOEAOZKIUOOWIRRIEHFLYVXPNMSVFSYWVTEVUIQLOVWNRCKEOTJUSQOVUINEHWGPSBVRFBLHWUEUVXJNMOSYGBVQQSJOITNLVXPNHHQPNBUIDRULREELVHPUNHVPVIEXEEMUIGEAHYBUWXRXOZKIMNUMEXAQJSTELHZPRURMTLYVMWEVTIOEZXXAAAKVPUVOIPTTZQNOVLPTTMEIEOHQELUKLRTIAQIPTTVWFUFPSEPZFJFRYIYEUVESNCBXGSOBVPFNIUINEBRMUMILUFITVGIUWKSEAQJIUUHHGSOIJSOTIXVXUZDYSAWHQZTTVRPRYSYCEUVRUCYOEPTZZIODYSPFSZVRURUQXOAVJQBCBDQMRMVXTEHWEYTMEQPINRYEEUFRBMYLRNEVUMFEDHREEVUMTBCHREOBLRDOOSYYPMLTMUMISCTYLIMEJUIXIMIWVRYPIYTLZWKEMXVPMMEXJLSDUFETHYFCBRWPACONBLIXWTEAUINAZHRPTZVZPYIQWOOVTGFQOHGPSBVXFXJOSCOVJGFMSVXPRMCEJSMRRDMWEGPEOUWPCICQFROQMYSBRRUENHBALWISOSWHQJSBVVFCYVXWEDVRUENUMPNLVTMUMMIAOCJWBIUOSCSTVZPLYWIEADVGVNNXQFLBLIVXVDXEEUVRUDULPPSMEXSAOQQLJMJXVEOAGZRJVEVDCJRPDMJEOCCHRDJWLVTIFQIQIBGETLUPSTNLIISEPHVPNKVMMNYVECRMKEQAMLPYHMJMUAJDWFNMDMOUNHQLIARZFCFDQTNMUYOLIUHZULLRFLUGCTLAVTFRWKELULVWTUMGIWAXFVUEXHQLCPRQCRYLPDEXVVDHUVYCUVSYTTYGIAATCETJOVXPACUITSOVHPLIGSSTYGIXAKYENBLHMWSMGISCBDWTNAKEMLUHXCIMEHFPFXWLLWIWDENRMDEILHFBYQIAAZCEHRUYMEELVWPNGDMYTQVRFTFDWPVMIMUEXHWLPPPWJOHRQTEQEHVIMDREMIKVJSNHMXAOZRBTCRRLSWLVJRYEMPNYLIUANHXPLCZHJSDHWZIBJEOSBXTAEMKWBNMFMXIMIXVNYVGPRBVWQAMXRAOTKVPNFXKFBZVIUAHFMPNKFVCEUXZZYIXIVRJDVEILVWSIPDKPSLVPBNOLXOIADSJQOHPPSBKSONIPWPIOEIVRCDPLUFIMWAAHWOETRRVINSPFTWEMFNHHPPCWIFFAOGMEJIDEJSJOYDJMWYTEGHVGEQCPFQOHGPDQJKSAWLIFXDFPBTCOIPNBVREINVMQAKZPFMYQXWAXRVPLYEMPNYLITALHTZNAVRFUNSEDUVSMFNAUEYDAVRTENQIXENLXQAMGYYGZRRESYFSFRATESNIXWOEDFRTCIQZPNQIUVEDDQLIAZPOEZXXOOVEIBUHKSXMMMMWAHWHPVWZVVNILWPACRYEEMVYDDMCEQOLWIOEARGIAGEVPUVFMTEUXSFUVVFFTYVYCUVSYTTYVGFLXKIBUXHWDUAUIMAJRVEELVWBCBDQMRMJIOOGPEYTLLROOGWIWQCVNBMULWALCJQBIMOINOZSIBUJHVNHMJSMINDMCEUVRUSOUPPBCJXFPFDGTDMEIQRIIICAYLIDEGRXFNQHYFCIPQPSQUEOSWHQZTCEMRUYLPCEXRREACWXZUBVWPNUPITLVVTSOHRRNAZZIODYSPFSQCRFRYPYLPIJYOEJOYXERLWRUUFIBUMAINEJUMDSMRQVRGXVPRNRMCLYPIYTLRYURYVEXIAJITOHWHPJIVRWOFHWWOQEHFMILZPRACINANLRWUQRYTSCLPXEYLMUTYUENOUDINEMDRNIMERFSYVTPRIEGFSXHNLEVMSMEYVPZIAVEVDCWEWOZJNBMULWALCJXSEMVETLTRRUAOEVFIBUIDENWICEXFRTEDHXPEIMIDTUQXOAXISQOMVEYSLFYUEXLWUEKVUVIFSVZNWEGFEMWXZUBJSOBUJERELVWBVILVBUQCEQRCVGSEHHYFLKXIXAQKVFIHISCTCEIRUYOIXATYIVRCPTTTWPECLYDTZUZJYJVCDVOEUDIOTMDRDRMGMUJOVUFAKVUVEMHWNHIEWPNMQIFSAVRUPFXWBUCEWFUFUIQRIZRKUMTYLCMHYFLYGIARWWYODCVHPSWEITPYUEYCMVYUPLLWNEUVPBNWRPTQCVVFFLDMYJIDEJSDDQLIAGPVSGDMDLMTSSBYDYTNLLMTAHWIYCWIIUOOWIXABIMTTYDQPAAFYSILHNPRWLPBINRYEDMJYJTYXRDIMXIBCIXWDIVJIOFUFIOETFMTEUXIEDCSYTTYHXOETRTPRNHEWOZJQFNZRRNAVKHBNMOIGETFYSSDHQLPXCMRUULEPNKYEJNYUPPSQUIFSUXBTDMVWDHYUGSAVKGFQOHGPTILKVRUOSTSMRYEEMDRNIMEWKOOUWNEYLIDENUMDTMUMTGLDGTECOWJNCVXCEURMHRYHXLUOLVBLILWPACUITAHFMPNAASVRMYSFLIZXGACUIPNBVRERYHRNRWRWTAHWWZNRRQBIMSPFSRVQFTYQETSIZRTILHZLNBTSOJYFXFRIEXNACVRLDZVWTAHWTWUALRFSSOPLBMRPPIMHEFDWEXMEMBIFXIIHFNNVQPBZLPBIYQXXAQEXFNUQXUUAHYBUZRRODCTSFULMINHMIGIACVEOEDZRFRWHPLEBGPVSYQGZRMDEUENHVPPWJEOTUOETSMJYSLYYIWOCIWEUWRYDSQEUVEWDVPSARMULUOYXIMIIEEFDPLMXVGFVYOSFRAMMPLYWGLRMJWFPUUPLLCDMFRYGIWATRQQEKXIDABVXFAYOPPNMGVFSMHVLPTLWBHDDQLIAGPVSUOSCSQCQFSYPFWAYLIMACUWPPIZWTIMVETTXRVGUGHTLRCEIOCYQWZIZZRWIMLFWEYLICAFDRNAQVRUDYVWPRIGLJNMGSYTTVWQAMIVZLIZIOTFHXLPQJHFLUFLLMJIIJNZRVEUVVQFCLLETJMKSODCHYEALFROEJDVDEARRHEMLPEAMEZPYYGYCEXZXEULHTTTMKHVNYSIYTPVWEAHVXPSZVWTOOYIYIZJHFLYQSCEJFMTOBESTSKVFPNHHTPNBYITENRYMLQVGFTNHPPNWIIQELGYPLMTSSBYDYOIBAENACVTWUAGVPPBHXPDQJNFENUIOEURPIEOUSTSMRYPUXHQZNURMTTIXNZUZJTSOJKIEEYLIUUMRMDUVVRWOSHHFTMEXBTYXVZUYLIMANHQAEBVXBINVMXPTVQFNNHGSOCVRBUZUEREURMTEHFSCEQEXSEJLHPSCIGFTNHXPRZVHFSYUXPEVJSSCYOIPDIEWDEFRKTSXRVMHIUVPUZYEOTYGMDMWZWJNWHVPMMEXKENHRDUXGPJEYAMDTMKMMERLWEEBZPJCCXRMACDIEEDXHPELZWEIMMIEEVJYQPFLIWEKFVCEUXHTTRRQBIMSPFSXISQHYWIOIAAIFTLHHPMICLFULRMDEILSVDYPSYTWLNPULVTCOXYIUEJDVNEKZIMTYQHFSCIRPSNHXPSXRVDEXLIFQCVXPUMGIFXVFYTAXRVZNAUMTAWHXEEIDIDHUUKPELVHPUFHYCSQUEOSFHTLRIUMTLILREAQEIMLYSSFRZRINBLDWDEZLRFFCOPPSIZRUEKXIWEARRHEMQSXMMEXMEHRVPEUSVBSMHVFNMGVFCCHYDEMKVBYIQRLNBVJJLFHUFETVWBNAHWYOUDIOTFHRZRMCIDOLEILULZXKAGDMDPTLWRUYFIETMGESOFHWZIBCITIAQEWDMESURYVIAAZRXJOHRMDEILSVDYPSYHCIPBIDHIYMMIIERYVWLNBIIOTLHHLNACEUEGSIEEZVXPULQILUZZZBGYGIWAVLMUPFXXZNQVROEHHPLIAJIQAMLGTUVVWFUFHTWUUVRPILHGZMUVWPUPHRTRLLQFNMRRREYLIUOHDQPAXISGELHPLIAJINAMRPTTCUIJNPLSWEMHYJTNHGPBCJXFAOGIDSCJHFMUSSCTMRVSAWKIEOVSIDDYPSYCWVYSENSVPCQGMUENRRDPMTXSEFRMYDMDEQOLWIWEKFVCEUXHTTRRQBIMSPFSMKPFCIUFPACZQNUUEPPEAKXPUDRYCSQEWUAFOIEOCASVRMLRDTICPFSOUPPBCJXFPUOIOEXRPMAMMYDTMRYEEMVYDDMCEQOLWIOEURGIAGEVPEBJITYYXBZNBKSVTYOEDEUSPBNWHHPSGVYYDOQHPMWEUVILHZPEBCEMUGLICELVPBLUPTPEVIYJSMHPLNBJYSLOLTCORVXUEMRRZMJIITULOIALIEGIELHXXOVRQFHIUWOUKVVDLYGINEBKIPMVUIBUQXMUFFRXEAVKITULOIALIEGIELQIAOCIVBPFXWDETVZFRDDQLIAGPVS\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "top=time.time()\n", "clef = AttaqueKasiski(TXT)\n", "temps=round(time.time()-top, 3)\n", "print(\"Clef trouvée en\", temps, \"secondes\")\n", "if(clef!=\"\") :\n", " print(\"La clef est :\", clef)\n", " print(\"Le message claire est :\")\n", " print(D_VIGENERE(TXT, clef))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }